#pragma once
#include <string>
#include <unordered_map>

namespace bitrpc
{
    #define KEY_METHOD "method"       // ⽅法名称：Rpc请求或服务操作请求中调用的方法名
    #define KEY_PARAMS "parameters"   // ⽅法参数
    #define KEY_TOPIC_KEY "topic_key" // 主题名称：发布订阅请求中涉及的主题标识
    #define KEY_TOPIC_MSG "topic_msg" // 主题消息：发布订阅请求中传递的消息内容
    #define KEY_OPTYPE "optype"       // 操作类型：发布订阅请求或服务操作请求的操作类型（如发布、订阅、启动、停止等）
    #define KEY_HOST "host"           // 主机信息：服务操作请求中涉及的主机信息
    #define KEY_HOST_IP "ip"          // IP地址：服务操作请求中主机的IP地址
    #define KEY_HOST_PORT "port"      // PORT端⼝：服务操作请求中主机的端口号
    #define KEY_RCODE "rcode"         // 响应码：请求处理结果的状态码
    #define KEY_RESULT "result"       // 调⽤结果：Rpc响应中返回的调用结果

    enum class MType
    {
        REQ_RPC = 0, // Rpc请求：表示一个远程过程调用的请求消息类型
        RSP_RPC,     // Rpc响应：表示一个远程过程调用的响应消息类型
        REQ_TOPIC,   // 主题操作请求：表示一个与主题相关的操作请求（如订阅或取消订阅）
        RSP_TOPIC,   // 主题操作响应：表示一个与主题相关的操作响应
        REQ_SERVICE, // 服务操作请求：表示一个与服务相关的操作请求（如启动、停止服务）
        RSP_SERVICE  // 服务操作响应：表示一个与服务相关的操作响应
    };

    enum class RCode
    {
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,
        RCODE_ERROR_MSGTYPE,
        RCODE_INVALID_MSG,
        RCODE_DISCONNECTED,
        RCODE_INVALID_PARAMS,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR
    };

    static std::string errReason(RCode code)
    {
        static std::unordered_map<RCode, std::string> err_map =
            {
                {RCode::RCODE_OK, "成功处理！"},
                {RCode::RCODE_PARSE_FAILED, "消息解析失败！"},
                {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误！"},
                {RCode::RCODE_INVALID_MSG, "无效消息"},
                {RCode::RCODE_DISCONNECTED, "连接已断开！"},
                {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数！"},
                {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务！"},
                {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
                {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题！"},
                {RCode::RCODE_INTERNAL_ERROR, "内部错误！"}};

        auto it = err_map.find(code);
        if (it == err_map.end())
        {
            return "未知错误";
        }
        return it->second;
    }
    // RPC请求类型定义
    enum class RType
    {
        REQ_ASYNC = 0, // 异步请求：返回异步对象，在需要的时候通过异步对象获取响应结果（如果还未收到结果会阻塞）
        REQ_CALLBACK   // 回调请求：设置回调函数，通过回调函数对响应进行处理
    };

    // 主题操作类型定义
    enum class TopicOptype
    {
        TOPIC_CREATE = 0, // 主题创建：表示创建一个新的主题
        TOPIC_REMOVE,     // 主题删除：表示删除一个已存在的主题
        TOPIC_SUBSCRIBE,  // 主题订阅：表示订阅一个主题以接收其消息
        TOPIC_CANCEL,     // 主题取消订阅：表示取消对一个主题的订阅
        TOPIC_PUBLISH     // 主题消息发布：表示向一个主题发布消息
    };

    // 服务操作类型定义
    enum class ServiceOptype
    {
        SERVICE_REGISTRY = 0, // 服务注册：表示将一个服务注册到服务管理系统中
        SERVICE_DISCOVERY,    // 服务发现：表示从服务管理系统中发现可用的服务
        SERVICE_ONLINE,       // 服务上线：表示一个服务已经启动并可以处理请求
        SERVICE_OFFLINE,      // 服务下线：表示一个服务已停止或不可用
        SERVICE_UNKNOW        // 未知操作：表示无法识别的服务操作类型
    };
}